#ifndef DBSERVICE_H
#define DBSERVICE_H

#include <QObject>
#include <QString>
#include <QDateTime>
#include <QSqlDatabase>
#include "./entities/constants.h"


class DBService : public QObject
{
    Q_OBJECT
public:
    static DBService& getInstance();

    // 禁用拷贝构造和赋值
    DBService(const DBService&) = delete;
    DBService& operator=(const DBService&) = delete;




private:
    explicit DBService(QObject *parent = nullptr);
    ~DBService();

    QSqlDatabase m_db;
    QString fileName;

    // 初始化数据库
    bool initializeDB(const QString &dbName, const QString password);

    // 判断数据库是否存在
    bool dbIsExisted() const;
    // 创建数据库
    bool createTables();

    // 加载本地数据
    void loadLocalData();

    // 加载新好友申请
    void loadNewFriendApplication();

    // 加载好友关系
    void loadFriendship();

signals:
    /* 发给UI线程 */
    // 数据库加载成功信号
    void dbSuccessfulLoaded();
    // 发送好友申请列表（参数其实就是NewFriendWidget中的那些成员变量）给MainWindow的
    void localNewFriendApplicationReady(const QString friendId, const QString nickname,
                    const QString verifyInfo, const QDateTime applyTime, const int id,
                    const QString alias, const FriendVerifyStatus status);
    // 发送好友关系
    void friendshipReady(const QString friendId, const QString nickname,
                         const QString alias, const QDateTime time);

    // 发送好友聊天记录信号
    void friendChatMsgReady(const QString friendId, const QString chatMsg,
                       const QDateTime datetime, const bool isMeSend);

public slots:
    /* 接受来自UI线程的信号 */
    // 初始化本地数据库
    void initLocalDB(const QString userId, const QString password);
    // 更新新好友申请关系
    void refreshNewFriendApplicationStatus(const FriendVerifyStatus status, const QString alias, const int serverId);
    // 保存新的好友关系（之前发送的好友申请对方通过了）
    void saveNewFriendship(const QString friendId, const QString nickname,
                    const QString alias, const QDateTime resultTime);

    /* 接受来自Handler线程的信号 */
    // 保存刚收到的好友申请到数据库
    void saveNewFriendApplication(const QString receiverId, const QString applicantId,
                                  const QString nickname, const QString verifyInfo,
                                  const QDateTime applyTime, const int id);
    // 保存刚刚收到的好友聊天消息
    void saveFriendSendChatMsg(const QString friendId, const QString msg, const QDateTime sendTime);

    // 保存自己发送给好友的聊天消息
    void saveMeSendChatMsg(const QString userId, const QString friendId,
                           const QString msg, const QDateTime sendTime);

    // 获取和某位好友的聊天记录（这里未来可以添加时间段参数来优化渲染内容）
    void acquireChatMsg(const QString friendId);

    // 其他人审核完毕了当前用户发起的好友申请（通过或者拒绝了当前用户）
    // void refreshFriendshipApplicationFromOther(const QString friendId, const QString nickname,
    //                 const QString status, const QString alias, const QDateTime resultTime);


};

#endif // DBSERVICE_H
